/**
 * api/dates
 */
module.exports = function(app) {
    const router = app.router;
    const SpecialDate = app.models.SpecialDate;

    /**
     * @apiVersion 1.0.0
     * @apiGroup SpecialDate
     * @api {get} /dates 获取角色列表
     * @apiParam {Number} status=ONLINE 上架状态 `0:OFFLINE, 1:ONLINE, 2:DEBUG`
     * @apiParam {Number} locate=home 角色位置 `home, post, date, home_date: 首页横幅`
     * @apiParam {Number} type=image 角色类型 `image, video`
     * @apiParam {Number} since 指定时间，单位秒
     * @apiParam {Number} page_size=20 分页大小
     * @apiParam {Number} page_num=1 页码
     * @apiParam {String} sort=priority-desc 排序，支持 `id-desc, id-asc, priority-desc`
     *
     * @apiParam {Number} status=1 `0:OFFLINE, 1:ONLINE, 2:DEBUG` 上架状态
     * @apiParam {Number} title 标题
     * @apiParam {String} locate 角色位置
     * @apiParam {String} scope 角色范围
     * @apiParam {String} scope_info 角色范围配置
     * @apiParam {String} type 角色类型 ``
     * @apiParam {String} asset_url 资源 URL
     * @apiParam {Number} width 宽
     * @apiParam {Number} height 高
     * @apiParam {Number} duration 角色时长，单位毫秒
     * @apiParam {String} url 跳转URL `如果为空则不跳转，其余按 H5内 `openPage.url` 和 全局规则`
     * @apiParam {Number} priority 排序优先级
     * @apiParam {Number} start_time 开始时间，单位秒
     * @apiParam {Number} end_time 结束时间，单位秒
     *
     * @apiSuccess {Number} status 上架状态
     * @apiSuccess {String} locate 角色位置 `home: date: recommed: 推荐位`
     * @apiSuccess {String} scope 角色范围
     * @apiSuccess {String} scope_info 角色范围配置
     * @apiSuccess {String} type 角色类型
     * @apiSuccess {String} asset_url 资源 URL
     * @apiSuccess {Number} width 宽
     * @apiSuccess {Number} height 高
     * @apiSuccess {Number} duration 角色时长，单位毫秒
     * @apiSuccess {String} url 跳转 URL `如果为空则不跳转，其余按 H5内 `openPage.url` 和 全局规则`
     ** @apiSuccess {Number} params 请求参数
     * @apiSuccess {Number} priority 排序优先级
     * @apiSuccess {Number} start_time 开始时间，单位秒
     * @apiSuccess {Number} end_time 结束时间，单位秒
     *
     * @apiSampleRequest
     */
    router.get('/dates', function *() {
        const query = this.query;

        // @TODO: 支持 scpoe 查询
        const specailDates = yield SpecialDate.query(qb => {
            qb.where('deleted', SpecialDate.NOT_DELETED);
            // sort
            // sortQB(qb, query.sort);
        })
        .fetchItems({
            page_size: query.page_size,
            page_num: query.page_num
        });

        this.body = specailDates;
    });

    router.get('/dates/:id', function *() {
        this.body = yield SpecialDate.where({
            id: this.params.id
        })
        .fetch({
            require: true
        });
    });

    /**
     * @apiVersion 1.0.0
     * @apiGroup SpecialDate
     * @api {post} /dates 新建角色
     *
     * @apiParam {Number} status 上架状态
     * @apiParam {String} locate 角色位置
     * @apiParam {String} scope 角色范围
     * @apiParam {String} scope_info 角色范围配置
     * @apiParam {String} type 角色类型
     * @apiParam {String} asset_url 资源 URL
     * @apiParam {Number} width 宽
     * @apiParam {Number} height 高
     * @apiParam {Number} duration 角色时长，单位毫秒
     * @apiParam {String} url 跳转 URL，如果为空则不跳转，其余按 H5内 `openPage.url` 规则
     * @apiParam {Number} priority 排序优先级
     * @apiParam {Number} start_time 开始时间，单位秒
     * @apiParam {Number} end_time 结束时间，单位秒
     */
    router.post('/dates', function *() {
        let body = this.request.body;

        const check = yield SpecialDate.query(qb => {
            qb.where('name', body.name);
            qb.where('deleted', SpecialDate.NOT_DELETED);
        })
        .fetch();

        if(check) {
            this.throw(400, '该名称已存在');
        }

        // body.start_time = new Date(body.start_time * 1000);
        // body.end_time = new Date(body.end_time * 1000);

        const dates = yield SpecialDate.where({
        })
        .orderBy('id')
        .fetchAll({
            require: false
        });

        body.bit_id = dates.models.length ? dates.models[dates.models.length - 1].get('id') * 2 : 1;

        console.log(body.id);

        if(body.end_time && +body.end_time > 0) {
            body.end_time = new Date(body.end_time * 1000);
        }

        if(body.start_time && +body.start_time > 0) {
            body.start_time = new Date(body.start_time * 1000);
        }

        let date = SpecialDate.safeForge(body);
        console.log(date);
        // date.set('id', body.id);
        this.body = yield date.save();
    });

    /**
     * @apiVersion 1.0.0
     * @apiGroup SpecialDate
     * @api {put} /dates/:id 修改角色
     *
     * @apiParam {Number} status 上架状态
     * @apiParam {String} locate 角色位置
     * @apiParam {String} scope 角色范围
     * @apiParam {String} scope_info 角色范围配置
     * @apiParam {String} type 角色类型 ``
     * @apiParam {String} recommend_type `home_recommend: 首页顶部推荐, feature_recommend: 特性（标签）推荐, templet_recommend 模板库推荐`
     * @apiParam {String} asset_url 资源 URL
     * @apiParam {Number} width 宽
     * @apiParam {Number} height 高
     * @apiParam {Number} duration 角色时长，单位毫秒
     * @apiParam {String} url 跳转URL `如果为空则不跳转，其余按 H5内 `openPage.url` 和 全局规则`
     * @apiParam {Number} priority 排序优先级
     * @apiParam {Number} start_time 开始时间，单位秒
     * @apiParam {Number} end_time 结束时间，单位秒
     *
     * @apiSuccess {Number} status 上架状态
     * @apiSuccess {String} locate 角色位置 `home: date: recommed: 推荐位`
     * @apiSuccess {String} scope 角色范围
     * @apiSuccess {String} scope_info 角色范围配置
     * @apiSuccess {String} type 角色类型
     * @apiSuccess {String} asset_url 资源 URL
     * @apiSuccess {Number} width 宽
     * @apiSuccess {Number} height 高
     * @apiSuccess {Number} duration 角色时长，单位毫秒
     * @apiSuccess {String} url 跳转 URL `如果为空则不跳转，其余按 H5内 `openPage.url` 和 全局规则`
     * @apiSuccess {Number} priority 排序优先级
     * @apiSuccess {Number} start_time 开始时间，单位秒
     * @apiSuccess {Number} end_time 结束时间，单位秒
     */
    router.put('/dates/:id', function *() {
        const body = this.request.body;
        let date = yield SpecialDate.where({
            id: this.params.id
        })
        .fetch({
            require: true
        });

        const check = yield SpecialDate.query(qb => {
            qb.where('name', body.name);
            qb.where('deleted', SpecialDate.NOT_DELETED);
        })
        .fetch();

        if(check && date.get('id') !== +this.params.id) {
            this.throw(400, '该名称已存在');
        }

        // body.start_time = new Date(body.start_time * 1000);
        // body.end_time = new Date(body.end_time * 1000);

        if(body.end_time && +body.end_time > 0) {
            body.end_time = new Date(body.end_time * 1000);
        }

        if(body.start_time && +body.start_time > 0) {
            body.start_time = new Date(body.start_time * 1000);
        }
        date.safeSet(body);

        yield date.save();

        this.body = date;
    });

    /**
     * @apiVersion 1.0.0
     * @apiGroup SpecialDate
     * @api {delete} /dates/:id 删除角色
     */
    router.delete('/dates/:id', function *() {
        let date = yield SpecialDate.where({
            id: this.params.id
        })
        .fetch({
            require: true
        });

        date.set('deleted', SpecialDate.DELETED);

        yield date.save();

        this.body = this.params;
    });
};
